package com.rem.cloudalibaba.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 熔断规则配置
 * 降级规则就是设置当满足什么条件的时候，对服务进行降级
 *
 * @author Rem
 * @date 2021-07-21
 */

@RestController
@Slf4j
public class SentinelDegradeController {


    /**
     * 熔断策略-慢调用比例
     * 最大RT(ms): 平均响应时间  最大4900  可通过-Dcsp.sentinel.statistic.max.rt=xxx设置  请求的响应时间大于该值则统计为慢调用
     * 比例阈值(0.0-1.0):熔断的慢调用比例 （超过最大RT的比例数）
     * 熔断时长：被熔断后多长时间不能访问
     * 最小请求数目:单位统计时长（s） 内请求数目大于设置的最小请求数目，并且  慢调用的比例大于阈值，则接下来的熔断时长内请求会自动被熔断
     * <p>
     * <p>
     * 经过熔断时长后熔断器会进入探测恢复状态，若接下来的一个请求响应时间小于设置的最大 RT 则结束熔断，若大于设置的最大 RT 则会再次被熔断。
     * example:设置最大RT:1ms 比例阈值:0.2  熔断:3s 最小请求数:2 进行测试 在1s内请求大于2个数目 肯定超过最大RT 比例也超过了20% 所以被限流
     *
     * @return
     */
    @GetMapping(value = "/degrade/slowCallRatio")
    public String degradeSlowCallRatio() {
        return "熔断策略-慢调用比例";
    }


    int num = 0;

    /**
     * 熔断策略-异常比例
     * 在统计周期内资源请求访问异常的比例大于设定的阈值，则接下来的熔断周期内对资源的访问会自动地被熔断
     * 设置比例阈值0.3  熔断时长4s  最小请求数2  当满足单位时间（s）请求大于2 并且异常比例大于0.2 将会触发熔断
     *
     * @return
     */
    @GetMapping(value = "/degrade/exceptionRatio")
    public String degradeExceptionRatio() {
        num++;
        if (num % 3 == 0) {
            throw new RuntimeException("触发异常比例熔断策略");
        }
        return "熔断策略-异常比例";
    }

    /**
     * 熔断策略-异常数
     * 在统计周期内资源请求访问异常数大于设定的阈值，则接下来的熔断周期内对资源的访问会自动地被熔断
     * 设置异常数2  熔断时长5s  最小请求数2  当满足单位时间（s）请求大于2 并且异常数大于2 将会触发熔断
     *
     * @return
     */
    @GetMapping(value = "/degrade/exceptionNum")
    public String degradeExceptionNum() {
        num++;
        if (num % 3 == 0) {
            throw new RuntimeException("触发异常数熔断策略");
        }
        return "熔断策略-异常数";
    }

}
